热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

铺满|两端_uniapp实现APP中内嵌H5应用

篇首语:本文由编程笔记#小编为大家整理,主要介绍了uniapp实现APP中内嵌H5应用相关的知识,希望对你有一定的参考价值。现如今,各大APP平台都有属于自

篇首语:本文由编程笔记#小编为大家整理,主要介绍了uniapp实现APP中内嵌H5应用相关的知识,希望对你有一定的参考价值。


现如今,各大APP平台都有属于自己的小程序体系,各种各样的应用都可直接内嵌在APP中实现一站式体验。使用uniapp开发的APP如何实现这样的功能呢?答案就是内嵌web-view


注意事项


  1. APP中有vue页面及nvue页面,两种页面均可内嵌web-view,但两种页面的表现不一:vue页面会自动铺满整个页面,接收web-view页面通信使用的是@message;nvue页面则需要指定页面宽高,接收web-view页面通信使用的是@onPostMessage

  2. 由APP通知web-view页面,无论是vue页面还是nvue页面,只有evalJS方法,但调用的姿势不一致

vue页面调用:

<template>
<web-view :src&#61;"url" &#64;message&#61;"message">web-view>
template>

<script>
export default
xxx,
onLoad()
this.currentWebview &#61; this.$mp.page.$getAppWebview();
this.currentWebview.children()[0].evalJS(&#39;xxx&#39;);


</script>

nvue页面调用&#xff1a;

<template>
<web-view ref&#61;"webview" :src&#61;"url" &#64;message&#61;"message">web-view>
template>

<script>
export default
xxx,
onReady()
this.currentWebview &#61; this.$refs.webview;
this.currentWebview.evalJS(&#39;xxx&#39;);


</script>

  1. nvue页面中使用的web-view页面是无法调用plus API的&#xff0c;vue页面是可以控制外部web-view页面是否可用plus API&#xff0c;其他事项具体参考web-view | uni-app官网

实现细节

博主使用的是vue页面的web-view组件&#xff0c;因为页面需要铺满屏幕且需要plus API支持&#xff0c;但实现的过程中还是会遇到大大小小的问题&#xff0c;下边举两个具体实现中遇到的问题及解决方案


  1. 顶部导航栏的表现不一&#xff1a;因内嵌web-view应用需要全屏显示&#xff0c;标题栏也交由内嵌应用自定义&#xff0c;故在pages.json中定义页面的时候&#xff0c;须将页面的titleNView设置为false。但即便如此&#xff0c;其表现仍然不一致&#xff0c;表现为android端的页面起始位置是手机屏幕的最顶部&#xff08;含状态栏在内&#xff09;&#xff0c;ios端则是从状态栏之下开始渲染页面&#xff0c;为了抹平差异&#xff0c;可使用webview的setStyle统一

APP端设置&#xff1a;

export default
xxx,
onReady()
this.currentWebview &#61; this.$mp.page.$getAppWebview();
// 提前计算好屏幕比率(screenRatio)&#xff0c;底部安全距离(safeAreaInsetsBtm)&#xff0c;区分平台(platform)
let screenRatio, safeAreaInsetsBtm, platform &#61; this.$store.state;
// 由于iOS端会自动定位top到状态栏底下&#xff0c;故这里需要判断手机系统
// 因调节Android端的top值能看出头部变化&#xff0c;故转换思路调ios端的top值
let top &#61; 0;
if (platform &#61;&#61;&#61; &#39;ios&#39;)
let info &#61; uni.getSystemInfoSync();
top &#61; -info.statusBarHeight;

let bottom &#61; safeAreaInsetsBtm / screenRatio;
this.currentWebview.children()[0].setStyle( top, bottom: parseInt(bottom) );


统一两端的top至手机屏幕最顶部&#xff0c;bottom至手机屏幕安全距离之上

内嵌应用中设置&#xff1a;

// 内嵌应用中&#xff0c;配置一个全局变量管理顶部样式&#xff0c;比如可在vuex的action中写个setPage方法
const actions &#61;
setPage(context)
let statusbarHeight &#61; plus.navigator.getStatusbarHeight();
let pageStyle &#61; paddingTop: &#96;calc(0.2rem &#43; $statusbarHeightpx)&#96; ;
context.commit(&#39;pageStyle&#39;, pageStyle);

;

  1. 内嵌应用中的数据传递&#xff1a;由APP中调用evalJS方法&#xff0c;调用到的是内嵌应用index.html中定义的方法&#xff0c;怎么将APP传递过来的信息传递到内嵌应用的vue页面去呢&#xff1f;这里推荐一个插件mitt

APP中调用&#xff1a;

export default
onReady()
this.currentWebview &#61; this.$mp.page.$getAppWebview();
this.currentWebview.children()[0].evalJS("showTip(&#39;提示测试&#39;)");


内嵌应用的index.html中&#xff0c;引用下载到本地的mitt.umd.js&#xff1a;

DOCTYPE html>
<html lang&#61;"en">
<head>
<meta charset&#61;"utf-8" />
<meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge" />
<meta name&#61;"renderer" content&#61;"webkit" />
<meta name&#61;"viewport" content&#61;"width&#61;device-width, user-scalable&#61;no, initial-scale&#61;1.0, maximum-scale&#61;1.0, minimum-scale&#61;1.0" />

<script src&#61;"<%&#61; BASE_URL %>libs/uni-app/uni.app.webview.1.5.2.js">script>

<script src&#61;"<%&#61; BASE_URL %>libs/mitt/mitt.umd.js">script>
<title>xxxtitle>
head>
<body>
<noscript>
<strong>当前浏览器版本太低&#xff0c;请升级浏览器或使用其他浏览器strong>
noscript>
<div id&#61;"app">div>

<script>
window.bus &#61; window.mitt();
const showTip &#61; (tip) &#61;>
window.bus.emit(&#39;showTip&#39;, tip);
;
script>
body>
html>

内嵌应用vue页面中&#xff1a;

export default
activated()
// 挂载
window.bus.on(&#39;showTip&#39;, (tip) &#61;>
alert(tip);
);

deactivated()
// 离开时记得销毁
window.bus.off(&#39;showTip&#39;);



总结

在实现的过程中&#xff0c;其实不单单只有这些内容&#xff0c;具体的实现还是需要各位真枪实弹编码踩坑&#xff0c;才能知道原来这里面还有这么细节的东西。只能感慨跨端确实不容易啊&#xff0c;继续加油吧&#xff0c;Keep learning…


推荐阅读
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 阿里“云开发“小程序(uniCould)
    博主ps:网上资料少的可怜,哎,腾讯云涨价了,论服务器,我肯定选的阿里,再着你们对比下unico ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • uniapp开发h5跨域问题
    最近用uni-app开发h5(公众号)发现一个问题,如 ... [详细]
  • 安卓ndk开发!高级Android晋升之View渲染机制,附答案
    缘起深圳市腾讯计算机系统有限公司成立于1998年11月,是中国最大的互联网综合服务提供商之一,也是中国服务用户最多的互联网企业之一。腾讯业务多元化& ... [详细]
  • uniapp中的样式和数据绑定(五)
    uni-app的样式1.uni-app种的样式1.1使用图标2.uni-app中的数据绑定3.v-bind动态绑定属性4.uni中的事件1.uni-app种的样式rpx即响应式p ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文介绍了如何在 Vue 3 组合 API 中正确设置 setup() 函数的 TypeScript 类型,以避免隐式 any 类型的问题。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有